/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.util.ArrayList;
import principal.*;

/**
 *
 * @author Pablo
 */
public class Pruebas {
    
    public static void main(String[] args) {
        ArrayList<Integer []> ali = new ArrayList<>();
//        Integer [] enteros = new Integer[10];
//        enteros[1]=2;
//        enteros[8]=22;
//        System.out.println(contar(enteros));  
//        System.out.println(pertenece(4,4,1,1,5,5));
          Arista a = new Arista(0,0,3,3);
          Arista b = new Arista(2,6,5,3);
          System.out.println(intersectanAristas(a, b));
    }
    
    public static int contar(Object [] vector){
        int contador =0;
        for(Object o: vector){
            if(o == null) continue;
            contador++;
        }
        
        return contador;
        
    }
    /*private static boolean pertenece(int x, int y, int x1,int y1, int x2, int y2){
                
        if(x1==x){
            if(y1==y) return true;
            return false;
        }
        if(x2==x){
            if(y2==y) return true;
            return false;
        }
        if(y1==y){
            if(x1==x) return true;
            return false;
        }
        if(y2==y){
            if(x2==x) return true;
            return false;
        }
        
        if(x>Math.max(x1,x2)) return false;
        if(y>Math.max(y1,y2)) return false;
        if(x<Math.min(x1,x2)) return false;
        if(y<Math.min(y1,y2)) return false;
        
        if((x2-x)/(y2-y)==(y1-y)/(x1-x)) return true; 
        return false;
    }*/
    private static boolean intersectaSegmento(int x1,int y1,int x2,int y2){
        
        return false;
    }
    
    public static int productoCruz(int ax, int ay, int bx, int by,int cx, int cy){
        return (bx-ax)*(cy-ay) - (by-ay)*(cx-ax);
    }
    
    public static boolean intersectanAristas(Arista a, Arista b){
        int d1,d2,d3,d4;
        d1 = productoCruz(b.x1,b.y1,b.x2,b.y2,a.x1,a.y1);
        d2 = productoCruz(b.x1,b.y1,b.x2,b.y2,a.x2,a.y2);
        d3 = productoCruz(a.x1,a.y1,a.x2,a.y2,b.x1,b.y1);
        d4 = productoCruz(a.x1,a.y1,a.x2,a.y2,b.x2,b.y2);
        if(((d1>0 && d2<0) || (d1<0 && d2>0)) &&
            ((d3>0 && d4<0) || (d3<0 && d4>0)))
            return true;

        if(d1==0 && pertenece(new Nodo(a.x1,a.y1,0,false),b))
            return true;
        if(d2==0 && pertenece(new Nodo(a.x2,a.y2,0,false),b))
            return true;    
        if(d3==0 && pertenece(new Nodo(b.x1,b.y1,0,false),a))
            return true;
        if(d4==0 && pertenece(new Nodo(b.x2,b.y2,0,false),a))
            return true;

        return false;
    }
    public static boolean pertenece(Nodo n, Arista a){
        //4 primeros casos cuando el punto está al inicio o al final de la arista
        if(a.x1==n.x){
            if(a.y1==n.y) return true;
            return false;
        }
        if(a.x2==n.x){
            if(a.y2==n.y) return true;
            return false;
        }
        if(a.y1==n.y){
            if(a.x1==n.x) return true;
            return false;
        }
        if(a.y2==n.y){
            if(a.x2==n.x) return true;
            return false;
        }
        
        //Si el punto está fuera de los límites del segmento (finito, a diferencia de una recta, devuelve inmediatamente falso)
        if(n.x>Math.max(a.x1,a.x2)) return false;
        if(n.y>Math.max(a.y1,a.y2)) return false;
        if(n.x<Math.min(a.x1,a.x2)) return false;
        if(n.y<Math.min(a.y1,a.y2)) return false;
        
        //Fórmula genérica que evalúa si un punto pertenece a una recta, como ya aplicamos previamente las validaciones para un 
        //segmento, podemos utilizarla para cuando el punto pueda estar dentro del segmento
        if((a.x2-n.x)/(a.y2-n.y)==(a.y1-n.y)/(a.x1-n.x)) return true; 
        return false;
    }
    
    
    
    
    
}
